In [1]:
import sys #only needed to determine Python version number
# Handle table-like data and matrices
import numpy as np
import pandas as pd
# Visualisation
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
import seaborn as sns
# Enable inline plotting
%matplotlib inline
# Modelo
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
print("ok")
In [8]:
# Realizamos la lectura del fichero y incluimos en el fichero el nombre de las columnas
names_features = [
'age', # Edad del individuo: [17 - 90] media 38,
'type_employer', # Tipo de trabajo : [ State-gov, Self-emp-not-inc, Private, Federal-gov, Local-gov, ?, Self-emp-inc, Without-pay, Never-worked ]
'fnlwgt', # Numero de personas encuestadas
'education', # Nivel mas alto de educacion para el individuo
'education-num', # Nivel mas alto de educacion en forma numerica [1 - 16]
'marital-status', # Estado civil de la persona: [ Never-married, Married-civ-spouse, Divorced, Married-spouse-absent, Separated, Married-AF-spouse, Widowed ]
'occupation', # Ocupacion de la persona: [ Adm-clerical, Exec-managerial, Handlers-cleaners, Prof-specialty, Other-service, Sales, Craft-repair, Transport-moving, Farming-fishing, Machine-op-inspct, Tech-support, ?, Protective-serv, Armed-Forces, Priv-house-serv']
'relationship', # Relacion familiar: [ Not-in-family, Husband, Wife, Own-child, Unmarried, Other-Relative]
'race', # Raza de un individuo: [ White, Black, Asian-Pac-Islander, Amer-Indian-Eskimo, Other ]
'sex', # Sexo de un individuo : [ Male, Female]
'capital_gain', # Ganancias de capital : [ 0 - 99999 ]
'capital_loss', # Perdidas de caapital : [ 0 - 4356 ]
'hours-per-week', # Horas trabajadas por semana : [ 1 - 99 ]
'native-country', # Pais de origen de la persona : [ ]
'income' # Indica si una persona gana o no mas de 50.000
]
df = pd.read_csv('adult.txt' , header=None, names=names_features)
df.head(3)
#print('ok')
Out[8]:
In [ ]:
columna_unica = df['native-country'].unique()
In [6]:
# Obtenemos las edades de las personas
edad = df['age']
# Hacemos una busqueda con las edades que pertenezcan a un rango
edad.where( edad < 30 ).where( edad > 18).count()
print('ok')
#",".join(ocupacion )
In [8]:
def isEEUU(x):
if x == ' United-States':
return 1
else :
return 0
# Aplicamos una funcion a la columna, para convertir los valores en enumerados
enum_isEEUU = df["native-country"].apply(isEEUU)
# Cramos la nueva columna enum_isEEUU con los datos anteriores
df["enum_isEEUU"] = enum_isEEUU
print('ok')
In [43]:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
# Mapea los valores unicos de type_employer a enumerados
le.fit(df["race"].unique())
# Muestra como lo ha mapeado
print(list(le.classes_))
# Aplicamos una funcion a la columna, para convertir los valores en enumerados
enum_razas = le.transform( df["race"])
# Cramos la nueva columna enum_razas con los datos anteriores
df["enum_race"] = enum_razas
#muestra la inversa
#list(le.inverse_transform(df["enum_razas"].head()))
print('ok')
In [20]:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
# Mapea los valores unicos de type_employer a enumerados
le.fit(df["type_employer"].unique())
# Transformamos la columna type_employer con 'labelEncoder' en enumerados
enum_type_employer = le.transform( df["type_employer"])
# Cramos la nueva columna enum_type_employer con los datos anteriores
df["enum_type_employer"] = enum_type_employer
print('ok')
In [102]:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["relationship"].unique())
enum_relationship = le.transform( df["relationship"])
df["enum_relationship"] = enum_relationship
#muestra la inversa
#list(le.inverse_transform(df["enum_rel"].head()))
print('ok')
In [12]:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["occupation"].unique())
df["enum_occupation"] = le.transform( df["occupation"])
print('ok')
In [13]:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["income"].unique())
# Muestra como lo ha mapeado
print(list(le.classes_))
df["enum_income"] = le.transform( df["income"])
print('ok')
In [14]:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["sex"].unique())
# Muestra como lo ha mapeado
print(list(le.classes_))
df["enum_sex"] = le.transform( df["sex"])
print('ok')
In [15]:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["marital-status"].unique())
# Muestra como lo ha mapeado
print(list(le.classes_))
df["enum_marital-status"] = le.transform( df["marital-status"])
print('ok')
In [49]:
plt.title('Personas que ganan mas de 50 o lo contrario', y=1.1, size=15)
sns.countplot('income', data=df)
Out[49]:
In [7]:
plt.title('Numero de personas que ganan mas o menos de 50k diferenciadas por sexos', size=20, y=1.1)
sns.countplot(x = 'income', hue='sex', data=df)
Out[7]:
In [27]:
plt.title('media de las que ganan mas o menos de 50k diferenciadas por sexos', size=20, y=1.1)
sns.barplot(x = 'income', y='enum_sex',data=df)
Out[27]:
In [51]:
plt.title('Numero de personas que ganan mas o menos de 50k diferenciadas por el tipo de trabajador', size=20, y=1.1)
sns.countplot(x = 'income', hue='type_employer', data=df)
Out[51]:
En esta grafica podemos ver que hay menos mujeres que ganan mas de 50k.
In [52]:
plt.title('Media de las ganancias diferenciadas por el tipo de trabajador', size=10, y=1.1)
sns.barplot(x = 'enum_type_employer', y='enum_income', data=df, hue="type_employer")
Out[52]:
Esta grafica nos muestra que los que mas ganan son los trabajadores con los puestos:
In [54]:
plt.title('Numero de personas que ganan mas o menos de 50k diferenciadas por la raza', size=20, y=1.1)
sns.countplot(x = 'income', hue='race', data=df)
Out[54]:
Aqui podemos ver que las personas de raza blanca son las mas numerosas. Del mismo modo se ve que los blancos son los que ganan mas de 50k.
In [66]:
plt.title('Media de las ganancias diferenciadas por la raza', size=20, y=1.1)
sns.barplot(x = 'enum_race', y='enum_income', data=df, hue="race")
Out[66]:
En cambio al hacer la media de las personas nos da como resultado que que los que mas ganan son los asiaticos.
In [68]:
plt.title('Numero de personas que ganan mas de 50k diferenciadas por la relacion familiar', size=20, y=1.1)
sns.countplot(x = 'income', hue='relationship', data=df)
Out[68]:
En esta grafica se aprecia que el numero de personas que ganan mas de 50k son los 'maridos'
In [65]:
plt.title('Media de las ganancias diferenciadas por la relacion familiar', size=20, y=1.1)
sns.barplot(x = 'enum_relationship', y='enum_income', data=df, hue="relationship")
Out[65]:
Aqui podemos ver las 'esposas' tienen la mayor media de ganancias (> 50k)
In [72]:
plt.title('Numero de personas que ganan mas de 50k diferenciadas por la ocupacion', size=20, y=1.1)
sns.countplot(x = 'income', hue='occupation', data=df)
Out[72]:
In [77]:
plt.title('Media de las ganancias diferenciadas por la relacion familiar', size=20, y=1.1)
sns.barplot(x = 'enum_occupation', y='enum_income', data=df, hue="occupation")
Out[77]:
In [83]:
plt.title('Distribucion de las horas por semana', size=20, y=1.1)
sns.distplot(df['hours-per-week'])
df['hours-per-week'].describe()
Out[83]:
Podemos observar que la mayoria de las personas trabajan 40h a la semana
In [87]:
colormap = plt.cm.viridis
plt.figure(figsize=(12, 12))
plt.title("Correlacion entre todas las features", y=1.05, size=20)
sns.heatmap(df.corr(), linewidths=0.1, square=True, vmax=1.0, annot=True, cmap=colormap)
Out[87]:
In [103]:
features = ["hours-per-week","enum_sex","enum_type_employer","enum_race","enum_income","age","education-num","capital_gain","capital_loss","enum_marital-status","enum_occupation","enum_relationship"]
X = df[features] # features
var_correlations = {c: np.abs(X['enum_income'].corr(df[c])) for c in X.columns}
corr_dataframe = pd.DataFrame(var_correlations, index=['Correlation']).T.sort_values(by='Correlation')
plt.title('Correlacion entre las features y la ganancia', y=1.1, size=20)
plt.barh(range(corr_dataframe.shape[0]), corr_dataframe['Correlation'].values, tick_label=X.columns.values)
Out[103]:
In [19]:
g = sns.FacetGrid(df, col='enum_income')
g.map(plt.hist, 'education-num', bins=20)
Out[19]:
In [57]:
from sklearn import svm
from sklearn.model_selection import cross_val_score
import pandas as pd
import numpy as np
# modelo
modelo = RandomForestClassifier(n_estimators=9, min_samples_split=2 ,min_samples_leaf =1, n_jobs = 49)
# Seleccionamos las features con las que vamos a usar el algoritmo
features = ["education-num","capital_gain","capital_loss","enum_marital-status","enum_occupation","enum_relationship"]
X = df[features] # features
y = df["enum_income"] # targets
#SCORE
scores = cross_val_score(modelo, X, y, cv = 5 )
print(scores.mean())
In [96]:
from sklearn.grid_search import GridSearchCV
# define the parameter values that should be searched
N_estimators = list(range(1, 20))
Min_samples_split= list(range(2, 10))
Min_samples_leaf = list(range(1, 2))
N_jobs = list(range(1, 20))
print(Min_samples_leaf)
print(Min_samples_split)
In [97]:
# create a parameter grid: map the parameter names to the values that should be searched
param_grid = dict(n_estimators=N_estimators, min_samples_split=Min_samples_split ,min_samples_leaf =Min_samples_leaf, n_jobs = N_jobs)
In [ ]:
# instantiate and fit the grid
grid = GridSearchCV(modelo, param_grid, cv=5, scoring='accuracy')
grid.fit(X, y)
In [ ]:
# view the complete results
grid.grid_scores_
In [ ]:
In [ ]: